package chap_01_CompletableFuture.step_02_CompletableFuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * @Description 常用API汇总：对计算速度进行选用
 * @Author shihan
 * @Date 2022/9/4 17:19
 * @Version 1.0
 */
public class CompletableStudy_04_API_04 {

    /**
     * 很实用的功能，对指定场景还是很有用的（举例：两个玩家同时进行俄罗斯方块的比赛对垒）
     *
     * @param args
     */
    public static void main(String[] args) {

        long t1 = System.currentTimeMillis();

        CompletableFuture<String> p1 = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "playerA";
        });

        CompletableFuture<String> p2 = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "playerB";
        });

        // 判定出两个异步任务谁先执行结束后，第二个参数 Function 的入参就是最先执行结束的异步任务的返回值
        // 从结果看，只要最先结束的那个出来后，会把还没结束的那个任务给"杀死"
        CompletableFuture<String> applyToEither = p1.applyToEither(p2, res -> {
            System.out.println(res);
            return res;
        });

        System.out.println("主线程进行判定：winner is【" + applyToEither.join() + "】");
        long t2 = System.currentTimeMillis();
        System.out.println("耗时：" + (t2 - t1));

    }

}
